//C实现定长内存池


#ifndef __memoryPool_H__
#define __memoryPool_H__

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MEM_PAGE_SIZE 0x1000  //page: 4096字节 - 4k

typedef struct mempool_s
{
    size_t block_size; //将4k分为多少个内存块
    size_t free_count; //每个内存块有多少字节

    void* mem;      //内存页开始的位置
    void* ptr;      //下一次分配内存开始的位置
}mempool_t;





void* self_malloc(mempool_t* mp, size_t size)
{
    //一次申请的内存只能小于等于mempool_t.block_size
    if(!mp || mp->block_size < size) return NULL;
    //一个页的内存已经用光了
    if(mp->free_count <= 0) return NULL;

    //更新链表的指向
    void* ptr = mp->ptr;
    mp->ptr = *(char**)mp->ptr;

    //更新内存块的数量
    --mp->free_count;

    return ptr;
}

void self_free(mempool_t* mp, void* ptr)
{
    if(!mp || !ptr) return;
    
    //将释放的空间放到空余空间的头部（头插法）
    *(char**)ptr = (char*)mp->ptr;
    //更新空余地址的指针
    mp->ptr = ptr;

    ++mp->block_size;
}


int memp_init(mempool_t* mp, size_t block_size)
{
    //初始化mempool_t
    if(!mp) return -1;
    memset(mp,0, sizeof(mempool_t));
    
    mp->block_size = block_size;
    mp->free_count = MEM_PAGE_SIZE / block_size;

    mp->mem = malloc(MEM_PAGE_SIZE);
    if(!mp->mem) return -2;

    mp->ptr = mp->mem;

    //在内存池中构建一个链表
    char* ptr = (char*)mp->mem;
    for(size_t i = 0; i < block_size; ++i)
    {
        *(char**)ptr = ptr + block_size;
        ptr += block_size;
    }

    return 0;
}




#endif


















